#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <sys/time.h>

#if 0
#include <linux/ktime.h>
/* 内核驱动中获取时间戳 */
static ktime_t get_kernel_timestamp(void)
{
    ktime_t ktime = ktime_get();        // 获取当前时间
    u64 timestamp = ktime_to_ns(ktime); // 将ktime转换为纳秒时间戳
 
    printk(KERN_INFO "Current timestamp: %llu nanoseconds\n", timestamp);

    return ktime;
}
#endif

int convert_utc_time( unsigned long long utc, char * ptime)
{
	struct tm *tm;
	time_t t = 0;

	if (utc == 0) {
		strncpy(ptime, "no time", 8);
		return -1;
	}
	
	t = utc / 1000 + 8 * 3600;
	tm = gmtime(&t);
	sprintf(ptime, "%04d:%02d:%02d %02d:%02d:%02d.%03d", tm->tm_year+1900, tm->tm_mon+1, tm->tm_mday,
	tm->tm_hour, tm->tm_min, tm->tm_sec, (int)utc%1000);

	printf("utc time for ac debug : [%s]\n", ptime);

	return 0;
}

static unsigned long long  GetSystemClock_ns()
{
	struct timespec time_start, time_end;

	clock_gettime(CLOCK_REALTIME, &time_start);

	return (long long unsigned)time_start.tv_sec * 1000000000 + (long long unsigned)time_start.tv_nsec;
}

static inline struct timeval AC_TIME_COMMON_GetMonotonic()
{
    struct timespec stTime;
	struct timeval stRet;

    clock_gettime(CLOCK_REALTIME, &stTime);
    
    stRet.tv_sec = stTime.tv_sec - timezone;
    stRet.tv_usec = stTime.tv_nsec/1000;

    return stRet;
}

static unsigned long long GetSystemClock()
{
    struct timeval tv;
	unsigned long long tv_sen;
	unsigned long long gltime;

    gettimeofday(&tv, NULL);

    tv_sen = tv.tv_sec;
    gltime = tv_sen * 1000 + tv.tv_usec / 1000;

    return gltime;
}

int main()
{
	char u_time[32] = {0};
	unsigned long long system_time = 0;

	struct timeval tmData = AC_TIME_COMMON_GetMonotonic();
    system_time = tmData.tv_sec*1000 + tmData.tv_usec / 1000;
	printf("get time %lld\n", system_time);	// 1655445920614 : 2022:06:17 14:05:20.654

	system_time = 0;
	system_time = GetSystemClock();
	printf("get time %lld\n", system_time);	// 1655446828225 : 2022:06:17 14:20:28.265

    system_time = 0;
	system_time = GetSystemClock_ns();      // 1721875113493839086
	printf("get time %lld\n", system_time);

	convert_utc_time(1655356228, u_time);
	convert_utc_time(1823430235, u_time);
	convert_utc_time(1918628771, u_time);

	convert_utc_time(1655445920614, u_time);	// 2022:06:17 14:05:20.654
	convert_utc_time(1655446828225, u_time);	// 2022:06:17 14:20:28.265
}
